
from PyQt5.QtWidgets import QWidget, QPushButton, QLineEdit, QPlainTextEdit, QMessageBox
from PyQt5.uic import loadUi

from base_api.HelloWorldClass import HelloWorld
from base_api.MessageClass import Message
from pyqt_api.SignalPoolClass import SignalPool

"""
主窗口
"""


class HelloWorldWindow:
    def __init__(self):
        # 加载ui文件创建ui对象
        self.window = loadUi('ui/helloworld.ui')
        self.window: QWidget
        # 显示该窗口对象
        # self.window.show()
        # 按钮，事件监听 绑定方法
        self.window.pushButton: QPushButton
        self.window.pushButton.clicked.connect(self.pushButton_clicked)

        # 工作标志
        self.work_flag = False
        # 信号池对象
        self.signalPoll = None
        # 任务对象，包含待执行方法
        self.helloWorld = None

    def pushButton_clicked(self):
        if not self.work_flag:
            # 创建信号池对象
            self.signalPoll = SignalPool()
            # 获取信号对象，成功
            if self.signalPoll.get_signal():
                # 切换工作状态
                self.work_flag = True
                """普通任务类对象的创建和初始化"""
                self.helloWorld = HelloWorld()
                # 读取输入
                self.window.lineEdit: QLineEdit
                s = self.window.lineEdit.text()
                self.helloWorld.name = s
                """信号池相关的处理"""
                # 绑定ui输出方法
                self.signalPoll.signal_this.connect(self.output)
                # 联通 普通任务类的输出->信号池输出
                self.helloWorld.output_access = self.signalPoll.output
                # 设置待执行的方法
                self.signalPoll.execute_method = self.helloWorld.say
                # 开启线程
                self.signalPoll.start()
            else:
                QMessageBox.warning(self.window, '警告', '信号池均被占用，请等待其它线程任务执行完毕或者手动结束')
        else:
            QMessageBox.warning(self.window, '警告', '当前任务正在执行过程中，请等待')

    def output(self, msg: Message):
        # 线程执行完毕
        if msg.status == -1:
            self.work_flag = False
        # 线程执行过程中输出
        elif msg.status == 1:
            self.window.plainTextEdit: QPlainTextEdit
            self.window.plainTextEdit.appendPlainText(str(msg.data))
        # 线程执行异常
        elif msg.status == -2:
            self.work_flag = False
            QMessageBox.warning(self.window, '警告', '任务执行过程发生异常，退出')

